import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 2017/6/14.
 */
public class AdvancedOperation {
    private static String host = "127.0.0.1";
    private static int port = 6379;

    public static void main(String[] args) {
        Jedis jedis = new Jedis(host, port);

        // 字符串的incr(inbrBy), decr(decrBy), append, substr, setrange, setbit操作
//        redisAdvancedString(jedis);

        // 列表的lrange, ltrim, brpoplpush, blpop操作
//        redisAdvancedList(jedis);

        // 集合的smove, sdiff, sinter, sunion操作
//        redisAdvancedSet(jedis);

        // 散列的hmset, hmget, hlen, hexists, hkeys, hvals, hincrby操作
//        redisAdvancedHash(jedis);

        // 有序集合的zcard, zincrby, zscore, zrank, zcount, zinter, zunion操作
        redisAdvancedZSet(jedis);
    }

    /**
     * 字符串的incr(inbrBy), decr(decrBy), append, substr, setrange, setbit操作
     * @param jedis
     */
    private static void redisAdvancedString(Jedis jedis) {
        jedis.incr("key");    // 对不存在的键执行自增操作，则视作0自增
        jedis.incrBy("key", 12);
        jedis.decr("key");
        jedis.decrBy("key", 8);
        System.out.println(jedis.get("key"));
        jedis.del("key");

        jedis.append("newKey", "hello ");    // 返回键的长度
        jedis.append("newKey", "World!");
        System.out.println(jedis.substr("newKey", 3, 7));
        jedis.setrange("newKey", 0, "H");
        jedis.setrange("newKey", 11, ", how are you?");
        System.out.println(jedis.get("newKey"));
        jedis.del("newKey");

        jedis.setbit("anotherKey", 2, "1");
        jedis.setbit("anotherKey", 7, "1");   // 按照偏移量从高位到低位排列, 0010 0001, 也就是ASCII为33的字符‘!’
        System.out.println(jedis.get("anotherKey"));
        jedis.del("anotherKey");
    }

    /**
     * 列表的lrange, ltrim, brpoplpush, blpop操作
     * @param jedis
     */
    private static void redisAdvancedList(Jedis jedis) {
        jedis.lpush("listKey", "new last", "last", "b", "a", "first");
        System.out.println(jedis.lrange("listKey", 2, -1));   // 返回start到end偏移量的元素，包括边界
        jedis.ltrim("listKey", 3, -1);
        System.out.println(jedis.lrange("listKey", 0, -1));
        jedis.lpush("listNewKey","item1", "item2", "item3");
        jedis.brpoplpush("listNewKey", "listAnotherKey", 1);   // 从listNewKey列表中最右端元素推入listAnotherKey列表左端，若无元素，则在1秒内阻塞等待元素
        System.out.println(jedis.lrange("listNewKey", 0, -1));
        System.out.println(jedis.lrange("listNewKey", 0, -1));
        System.out.println(jedis.lrange("listAnotherKey", 0, -1));
        System.out.println(jedis.blpop(1, "listNewKey", "listAnotherKey"));  // 从第一个非空的列表弹出最左元素， 返回该列表和被弹出的元素，若无元素，则在1秒内阻塞等待元素
        jedis.del("listKey");
        jedis.del("listNewKey");
        jedis.del("listAnotherKey");
    }

    /**
     * 集合的smove, sdiff, sinter, sunion操作
     * @param jedis
     */
    private static void redisAdvancedSet(Jedis jedis) {
        jedis.sadd("setKey", "a", "b", "c", "d");
        jedis.sadd("anotherSetKey", "c", "d", "e");
        jedis.smove("setKey", "anotherSetKey", "z");   // 将setKey中的‘z’元素移到anotherSetKey中，不存在则不操作
        System.out.println(jedis.sdiff("setKey", "anotherSetKey"));     // 返回存在于第一个集合但不存在于其他集合中的元素
        System.out.println(jedis.sinter("setKey", "anotherSetKey"));    // 返回同时存在所有集合中的元素
        System.out.println(jedis.sunion("setKey", "anotherSetKey"));    // 返回至少存在于一个集合中的元素
        jedis.del("setKey");
        jedis.del("anotherSetKey");
    }

    /**
     * 散列的hmset, hmget, hlen, hexists, hkeys, hvals, hincrby操作
     * @param jedis
     */
    private static void redisAdvancedHash(Jedis jedis) {
        Map<String, String> map = new HashMap<>();
        map.put("k1", "41");
        map.put("k2", "v2");
        map.put("k3", "v3");
        jedis.hmset("hashKey", map);
        System.out.println(jedis.hlen("hashKey"));
        System.out.println(jedis.hexists("hashKey", "k2"));
        System.out.println(jedis.hkeys("hashKey"));
        System.out.println(jedis.hvals("hashKey"));
        System.out.println(jedis.hincrBy("hashKey", "k1", 2));
        jedis.del("hashKey");
    }

    /**
     * 有序集合的zcard, zincrby, zscore, zrank, zcount, zinter, zunion操作
     * @param jedis
     */
    private static void redisAdvancedZSet(Jedis jedis) {
        jedis.zadd("zsetKey", 3, "a");
        jedis.zadd("zsetKey", 2, "b");
        jedis.zadd("zsetKey", 1, "c");
        System.out.println(jedis.zcard("zsetKey"));
        jedis.zincrby("zsetKey", 2.0, "a");
        System.out.println(jedis.zscore("zsetKey", "a"));   // 获取某个成员的得分
        System.out.println(jedis.zrank("zsetKey", "c"));   // 获取某个成员的排名
        System.out.println(jedis.zcount("zsetKey", 0, 3));   // 获取得分区间内的成员

        jedis.zadd("zsetNewKey", 5, "c");
        jedis.zadd("zsetNewKey", 4, "d");
        jedis.zadd("zsetNewKey", 2, "e");
        System.out.println(jedis.zinterstore("zsetAnotherKey", "zsetNewKey", "zsetKey"));   // 把zsetNewKey, zsetKey集合中的交集存于zsetAnotherKey集合中, 得分相加
        System.out.println(jedis.zunionstore("zsetAnotherKey2", "zsetNewKey", "zsetKey"));   // 把zsestNewKey, zsetKey集合中的并集存于zsetAnotherKey集合中,得分相加
        System.out.println(jedis.zrangeWithScores("zsetAnotherKey", 0, -1));
        jedis.del("zsetKey");
        jedis.del("zsetNewKey");
        jedis.del("zsetAnotherKey");
        jedis.del("zsetAnotherKey2");
    }
}
